iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

終於要準備開始逆向了,首先先用C語言寫兩個小程式
在兩個系統中的HelloWorld的C語言程式
https://ithelp.ithome.com.tw/upload/images/20240919/2016901651XNLkvHKc.png
簡單來說就是Helloworld字串會跑6次之後結束。

把它送到IDA Pro和GDB中,GDB可能顯示的會是at&t,如果不習慣可以跟我一樣換成intel的顯示方式GDB 設定set disassembly-flavor intel。

在編譯時會關閉一些保護機制,例如Stack canary、NX、PIE,方便我們觀察還有後續做簡單的Stack buffer overflow,可以利用checksec這個工具去確認執行檔的保護機制狀態(在GCC中可下-fno-stack-protector -no-pie -zexecstack指令來關閉),要注意的是,windows預設情況下是不能關閉NX的,這邊在windows當中不會關閉,後續做return to Stack shell code時會以Ubuntu為主 。
https://ithelp.ithome.com.tw/upload/images/20240919/20169016U2EaqwhHV9.png
https://ithelp.ithome.com.tw/upload/images/20240919/20169016sSAfmhIV7o.png
很明顯的發現IDA是比較好閱讀的,在這一章我們會大概敘述程式流程,但在接下來的章節會更詳細的敘述整體程式碼。
我們逐行來看,IDA會先顯示需要用到的資訊,Str是bytes格式放在-10hex的地方,依此類推。
而Ubuntu會先做End Branch 64 bit,這是一種intel的保護機制,防止一些利用間接分支的攻擊,例如 ROP等。
接下來會拉出Stack所需要的空間,也就是
push rbp
mov rbp, rsp
sub rsp,xxx
這個部分會再下一章詳細說明,接下來是將一串hex放入RAX內,而這一串是ASCII Code的Hex,再來將RAX放入Stack的RBP+Str的位置,也就是RBP-0x10的地方,接下去也是mov一串ASCII Code到Stack內,由於字串太長,所以這邊會分兩次放入。

接下去的Jmp在IDA中是有圖形化箭頭指向,而在GDB內是寫跳到main+58的位址,接下去就會做cmp也就是比較,如果符合小於等於5就會轉跳到IDA的綠色箭頭;GDB的main+42位址,如果不符合IDA指向紅色箭頭做結束,GDB接著往下跑,最後將Stack的空間釋放後程式結束。

這邊先讓各位大概有一個Reverse的感覺。


上一篇
Windows IDA介紹
下一篇
分配 Stack 空間
系列文
從0開始的打Pwn教學14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言